package com.atguigu;

import java.util.HashMap;
import java.util.Stack;

/**
 * @author li.chunlong lcl253-137@alibaba-inc.com
 * @desc 计算器
 * @date 2021-10-22
 */
public class Calculator {

    /**
     * 定义表达式
     */
    private final Expression expression;

    /**
     * 构造函数传参，并解析
     *
     * @param expStr 计算表达式的公式: expStr = a+b
     */
    public Calculator(String expStr) {
        // 安排运算先后顺序
        Stack<Expression> stack = new Stack<>();

        // 表达式拆分成字符数组 [a、 +、 b]
        char[] charArray = expStr.toCharArray();

        Expression left, right;

        /*
         * 遍历我们的字符数组, 即遍历[a、 +、 b]; 针对不同的情况，做不同的处理
         */
        for (int i = 0; i < charArray.length; i++) {
            switch (charArray[i]) {
                case '+':
                    // 从stack取出left => "a"
                    left = stack.pop();
                    // 取出右表达式 "b"
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    // 然后根据得到的left和right构建AddExpression再加入stack
                    stack.push(new AddExpression(left, right));
                    break;
                case '-':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new SubExpression(left, right));
                    break;
                default:
                    // 如果是一个var变量, 就创建要给VarExpression对象，并push到stack
                    stack.push(new VarExpression(String.valueOf(charArray[i])));
                    break;
            }
        }
        // 当遍历完整个charArray数组后，stack就得到最后Expression
        this.expression = stack.pop();
    }

    public int run(HashMap<String, Integer> var) {
        /*
         * 最后将表达式a+b和var={a=10,b=20}
         * 然后传递给expression的interpreter进行解释执行
         */
        return this.expression.interpreter(var);
    }
}
